package data_structure.stack;

/**
 * @Author: lijun
 * @Date: 2018/11/1 10:57
 * 给定一个非负整数数组，a1, a2, ..., an, 和一个目标数，S。现在你有两个符号 + 和 -。对于数组中的任意一个整数，你都可以从 + 或 -中选择一个符号添加在前面。
 * 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
 * 输入: nums: [1, 1, 1, 1, 1], S: 3
 * 输出: 5
 * 解释:
 *  -1+1+1+1+1 = 3
 *  +1-1+1+1+1 = 3
 *  +1+1-1+1+1 = 3
 *  +1+1+1-1+1 = 3
 *  +1+1+1+1-1 = 3
 *  一共有5种方法让最终目标和为3。
 */
public class FindTargetSumWays {

    public int findTargetSumWays(int[] nums, int S) {
        int result = dfs(0,0,nums, S);
        return result;
    }

    private int dfs(int cur, int i, int[] nums, int S) {
        if (i == nums.length) {
            return (cur == S) ? 1 : 0;
        }
        return  dfs(cur + -nums[i],i+1,nums, S) + dfs(cur + nums[i],i+1,nums, S);
    }

    public static void main(String[] args) {
        int[] nums = {1,1,1,1,1};
        int s = 3;
        System.out.println(new FindTargetSumWays().findTargetSumWays(nums, s));
    }
}
